package com.clock.common.utils;


import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.Calendar;
import java.util.Date;


/**
 * 时间处理工具类
 *
 * @author
 * @return
 */
public class LocalDateTimeUtil{

    /**
     * 时间格式
     */
    private static final String YYYYMMDD = "yyyyMMdd";
    private static final String YYYYMM = "yyyyMM";
    private static final String YYYY = "yyyy";
    private static final String DD = "dd";


    /**
     * 判断时间 小于
     * <P>   t1 < t2 = true （如：2019-10-13 11:11:00 < 2020-11-13 13:13:00 = true）  </P>
     *
     * @author
     */
    public static boolean isBefore(LocalDateTime t1, LocalDateTime t2) {
        return t1.isBefore(t2);
    }

    /**
     * 判断时间 大于
     * <P>   t1 > t2 = true  </P>
     *
     * @author
     */
    public static boolean isAfter(LocalDateTime t1, LocalDateTime t2) {
        return t1.isAfter(t2);
    }


    //========================================================================================================
    //============================================== 时间获取 =================================================
    //========================================================================================================

    /**
     * 获取yyyyMM格式时间戳
     * @return  java.lang.String
     */
    public static String  getYYYYMMDDLocalDate() {
        return parse(LocalDateTime.now(), YYYYMMDD);
    }

    /**
     * 获取yyyyMM格式时间戳
     * @return  java.lang.String
     */
    public static String  getYYYYMMLocalDate() {
        return parse(LocalDateTime.now(), YYYYMM);
    }

    /**
     * 获取dd格式时间戳
     *
     * @return java.lang.String
     */
    public static String getDDLocalDate() {
        return parse(LocalDateTime.now(), DD);
    }

    /**
     * 获取指定某一天的开始时间 00:00:00
     *
     * @param time
     * @return java.time.LocalDateTime
     */
    public static LocalDateTime getDayStart(LocalDateTime time) {
        return time.withHour(0)
                .withMinute(0)
                .withSecond(0);
    }


    /**
     * 获取指定某一天的结束时间  23:59:59
     *
     * @author
     */
    public static LocalDateTime getDayEnd(LocalDateTime time) {
        // 年 月  天 时 分 秒
        return time.withHour(23)
                .withMinute(59)
                .withSecond(59);
    }

    /**
     * 获取指定时间是周几  1到7
     *
     * @author
     */
    public static int week(LocalDateTime time) {
        return time.getDayOfWeek().getValue();
    }


    /**
     * 获取两个日期的时间差
     *
     * @param startTime 开始时间
     * @param endTime   计算时间
     * @param field     根据field不同减不同值 , field 为 ChronoUnit.*
     * @return startTime小 endTime大 返回正数，则反之
     *
     * <p>
     * 秒    ChronoUnit.SECONDS
     * 分    ChronoUnit.MINUTES
     * 时    ChronoUnit.HOURS
     * 半天  ChronoUnit.HALF_DAYS
     * 天    ChronoUnit.DAYS
     * 月    ChronoUnit.MONTHS
     * 年    ChronoUnit.YEARS
     * </P>
     */
    public static long betweenTwoTime(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit field) {
        Period period = Period.between(LocalDate.from(startTime), LocalDate.from(endTime));
        if (field == ChronoUnit.YEARS) {
            return period.getYears();
        }
        if (field == ChronoUnit.MONTHS) {
            return period.getYears() * 12L + period.getMonths();
        }
        return field.between(startTime, endTime);
    }


    /**
     * 获取指定时间之前的日期
     *
     * <P> 根据field不同减不同值, field 为 ChronoUnit.*
     * 秒   ChronoUnit.SECONDS
     * 分   ChronoUnit.MINUTES
     * 时   ChronoUnit.HOURS
     * 半天  ChronoUnit.HALF_DAYS
     * 天    ChronoUnit.DAYS
     * 月    ChronoUnit.MONTHS
     * 年    ChronoUnit.YEARS
     * </P>
     * @version 1.0.1
     */
    public static LocalDateTime subtract(LocalDateTime time, long number, TemporalUnit field) {
        return time.minus(number, field);
    }

    /**
     * 获取当前月份
     *
     * @return 月
     */
    public static int queryCurrentMonth() {
        LocalDate localDate = LocalDate.now();
        return localDate.getMonthValue();
    }


    /**
     * 获取该月的天数
     * @param date
     * @return
     */
    public static int getDaysOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }


    /**
     * 获取yyyy-MM-dd HH:mm:ss格式的时间
     * @return
     */
    public static LocalDateTime getLocalDateTime() {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime time = LocalDateTime.now();
        String localDateTime = df.format(time);
        return LocalDateTime.parse(localDateTime, df);
    }


    //========================================================================================================
    //========================================================================================================
    //========================================================================================================
    //============================================== 转换相关 =================================================
    //========================================================================================================
    //========================================================================================================

    /**
     * LocalDateTime 转为 天 的字符串，如 1号返回 01
     *
     * @author
     */
    public static Integer parseDayInt(LocalDateTime time) {
        return Integer.parseInt(parse(time, "dd"));
    }



    /**
     * LocalDateTime 转 秒
     *
     * @author
     */
    public static Long parseSecond(LocalDateTime time) {
        return time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    }


    /**
     * 将时间戳转 为 LocalDateTime
     *
     * @param timestamp
     * @return java.lang.String
     */
    public static LocalDateTime parseTimestamp(Long timestamp) {
        return LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
    }

    /**
     * 将LocalDateTime 转 为时间戳
     *
     * @return java.lang.String
     */
    public static Long parseTimestamp(LocalDateTime time) {
        return time.toEpochSecond(ZoneOffset.ofHours(8));
    }


    /**
     * LocalDateTime 转指定类型的字符串
     *
     * @param time    time    时间
     * @param pattern pattern 格式
     *
     * @return java.lang.String
     *
     */
    public static String parse(LocalDateTime time, String pattern) {
        if (time == null) {
            return null;
        }
        DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
        return df.format(time);
    }

    /**
     * LocalDate 转换Date
     *
     * @param localDate 时间
     * @return
     */
    public static Date LocalDateToDate(LocalDate localDate) {
        Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
        return Date.from(instant);
    }


    /**
     * LocalDateTime 转Date
     * @param localDateTime
     * @return
     */
    public static Date LocalDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * Date 转LocalDateTime
     * @param date
     * @return
     */
    public static LocalDateTime DateToLocalDateTime(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }



}
